package com.lv.shiro;


import com.lv.util.JwtUtil;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
//    FilterFactoryBean 配置过滤器链
//    Subject： 用户主体（把操作交给SecurityManager）
//    SecurityManager：安全管理器（关联Realm）
//    Realm：Shiro连接数据的桥梁


    @Bean
    public ShiroFilterFactoryBean factoryBean(@Autowired DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        /*shiro的过滤器里面,优先放过某些,然后我们才可以拦截所有等等,所以我们需要一个有序的map
        *   有序map  linkedHashMap:怎么存就怎么取; TreeMap:是按照key的大小自动排序
        * */

        /*配置的过滤器,哪些路径可以不用登录,哪些路径必须登录,哪些必须有权限等等
        *  key表示路径,value叫过滤器,表示我们当前路径如何过滤
        *    anon: 表示不需要登录直接放过,不需要认证就能访问的过滤器
        *    authc: 表示必须登录/认证 才能访问
        *    perms: 必须有权限才可以访问,权限过滤器
        *    logout: 退出登录的过滤器
        * */
        Map<String,String> map = new LinkedHashMap<>();
        map.put("/login","anon");    //不放过会报错

        map.put("/sellerlogin","anon");    //不放过会报错
        map.put("/seller","anon");    //不放过会报错
        //退出登录
        map.put("/logout","logout");
        //  /**一定要放在最下面
       // map.put("/**","authc");    //必须认证才能访问
        factoryBean.setFilterChainDefinitionMap(map);
        //跳转登录页面   拦截后
//        factoryBean.setLoginUrl("/toLogin");
        //设置未授权提示页面
        factoryBean.setLoginUrl("/toLogin");
        factoryBean.setUnauthorizedUrl("/unauthorized");
        //需要将安全管理器放入过滤器工厂类中
        factoryBean.setSecurityManager(defaultWebSecurityManager);
        //设置安全管理器
        return factoryBean;
    }
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(@Autowired LoginRealm loginRealm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //关联Realm
        defaultWebSecurityManager.setRealm(loginRealm);
        return defaultWebSecurityManager;
    }
    @Bean
    public LoginRealm loginRealm(@Autowired HashedCredentialsMatcher hashedCredentialsMatcher){
        LoginRealm realm = new LoginRealm();
        realm.setCredentialsMatcher(hashedCredentialsMatcher);
        return realm;
    }

    //配置加密类
    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher(){
        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        //配置加密算法 MD5
        matcher.setHashAlgorithmName("MD5");
        //迭代次数: 我们先通过MD5加一次密,然后再通过MD5 将加过密的密码再次加密
        matcher.setHashIterations(10);
        //设置加密编码
        matcher.setStoredCredentialsHexEncoded(true);
        return matcher;
    }

    @Bean
    public JwtUtil jwtUtil() {
        return new JwtUtil();
    }

}
